 
let obj = { //定义一个对象
    name:"ZengYuJie",
    age:"18"
}

let arr = ['1','2','3','4','5']

let map = new Map([
    ['a', 2],
    ['b', 3],
    ['c', 4]
])  //[   [k,v]对 ]

Object.prototype.gender = '男' //在对象中原型链上挂载一个属性


//使用for(...in...)方法进行遍历对象,只能拿出键名

for(key in arr){
    console.log('arrkey',arr[key]) //使用for in 遍历数组,但是数组自身有更好的遍历方式
}

for(key in obj){
    console.log('objkey',key)  // 使用for in遍历对象,输出键值,并且会遍历出原型链上的属性
}
for(key in map){
    console.log('mapkey',key)  // 使用for in遍历map对象,不能遍历,set/map不可枚举
}
// 实现 obj 的迭代器，使其可以被 for...of 正确遍历
obj[Symbol.iterator] = function* () {
    // 只遍历自身属性，不包括原型链
    for (let key of Object.keys(this)) {
        yield this[key]
    }
}

//使用for(...of...)方法遍历对象的值(in是键名,of是键值),适用于所有实现了迭代器的数据结构
for(value of obj){
    console.log('objvalue',value)
}
for(value of arr){
    console.log('arrvalue',value) //使用for of 遍历数组,输出数组中的值
}
for(value of map){
    console.log('mapvalue',value) //使用for of 遍历map对象,输出每一个键值对
}

for([key,value] of map){ //解构赋值
    console.log('mapkey',key)
    console.log('mapvalue',value)
}